import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 导入数据与数据处理
data = pd.read_excel('第二章 图表(前15).xlsx',sheet_name='11 平滑折线图',usecols='B:D',skiprows=1)
data['月份'] = data['月份'].str.extract(r'^(.*)月').astype(int)
x1 = data['月份'].values[0:8]
x2 = data['月份'].values[8:] +12
x = [*x1, *x2]
y = data['销量'].values.tolist()

# 插值使得折线平滑
spl = make_interp_spline(x, y, k=3)
x_smooth = np.linspace(np.min(x), np.max(x), 500)
y_smooth = spl(x_smooth)

# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(10, 6))

# 设置背景颜色
fig.patch.set_facecolor('#00002d')
ax.set_facecolor('#00002d')

# 设置X轴标签
ax.set_xticks(x)
ax.set_xticklabels(data['月份'], color='w')

# 设置Y轴标签颜色为白色
ax.set_ylim(0, 4000)
ax.set_yticks(ax.get_yticks())
ax.set_yticklabels(ax.get_yticks(), color='w')

# 保留底部边框，隐藏其他边框
for spine in ax.spines.values():
    if spine.spine_type == 'bottom':
        spine.set_color('white')  # 设置底部边框颜色为白色
    else:
        spine.set_visible(False)

# 调整图形位置
plt.subplots_adjust(top=0.8)  # 留出空间给标题

# 添加标题
plt.text(0, 1.15, '化妆品品类月度销量走势', color='w', fontsize=24, transform=ax.transAxes)
plt.text(0, 1.05, '2022年销量迅速增加，1月最高，销量达到3782', color='w', fontsize=16, transform=ax.transAxes)

# 绘制从最大y值到x轴的垂线
ax.axvline(x[y.index(np.max(y))], ymin=0, ymax=np.max(y) / 4000, color='white', linestyle='--')
ax.annotate(f'{np.max(y)}', xy=(x[y.index(np.max(y))], np.max(y)),
            xytext=(x[y.index(np.max(y))], np.max(y) + 300),
            color='white', fontsize=12)

# 绘制图
plt.plot(x_smooth, y_smooth, color='red', linewidth=2)

# 导出图片
#plt.savefig('D:/python charm/01/可视化/第二章/图片/平滑折线图.png', dpi=300, bbox_inches='tight', facecolor='#00002d')
plt.show()